add support for per-target rustflags in .cargo/config
authorJorge Aparicio <japaricious@gmail.com>
Tue, 4 Oct 2016 01:37:25 +0000 (20:37 -0500)
committerJorge Aparicio <japaricious@gmail.com>
Tue, 4 Oct 2016 01:40:34 +0000 (20:40 -0500)
you can now specify rustflags on a per-target basis in .cargo/config:

``` toml
[target.x86_64-unknown-linux-gnu]
rustflags = ["x86", "specific", "flags"]

[target.arm-unknown-linux-gnueabi]
rustflags = ["arm", "specific", "flags"]
```

If both build.rustflags and target.*.rustflags are specified, the
target.* ones will be used.

As before RUSTFLAGS overrides either set.

closes #3153

src/cargo/ops/cargo_rustc/context.rs
tests/rustflags.rs

index fe0a94241411c6d60b2e7c8563243f3ddf6dedf0..7cbd2149fe4671d175042933d371bbf2a0e47ddf 100644 (file)
@@ -775,8 +775,16 @@ fn env_args(config: &Config,
         return Ok(args.collect());
     }
 
-    // Then the build.rustflags value
     let name = name.chars().flat_map(|c| c.to_lowercase()).collect::<String>();
+    // Then the target.*.rustflags value
+    let target = build_config.requested_target.as_ref().unwrap_or(&build_config.host_triple);
+    let key = format!("target.{}.{}", target, name);
+    if let Some(args) = try!(config.get_list(&key)) {
+        let args = args.val.into_iter().map(|a| a.0);
+        return Ok(args.collect());
+    }
+
+    // Then the build.rustflags value
     let key = format!("build.{}", name);
     if let Some(args) = try!(config.get_list(&key)) {
         let args = args.val.into_iter().map(|a| a.0);
index ccdc6a91dc92d814f82ea944741b87cf9b199cf8..cc9266ac281a69863bfbbda4156e51bd11766459 100644 (file)
@@ -878,3 +878,74 @@ fn build_rustflags_with_home_config() {
     assert_that(p.cargo("build").arg("-v"),
                 execs().with_status(0));
 }
+
+#[test]
+fn target_rustflags_normal_source() {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.0.1"
+        "#)
+        .file("src/lib.rs", "")
+        .file("src/bin/a.rs", "fn main() {}")
+        .file("examples/b.rs", "fn main() {}")
+        .file("tests/c.rs", "#[test] fn f() { }")
+        .file("benches/d.rs", r#"
+            #![feature(test)]
+            extern crate test;
+            #[bench] fn run1(_ben: &mut test::Bencher) { }"#)
+        .file(".cargo/config", &format!("
+            [target.{}]
+            rustflags = [\"-Z\", \"bogus\"]
+            ", rustc_host()));
+    p.build();
+
+    assert_that(p.cargo("build")
+                .arg("--lib"),
+                execs().with_status(101));
+    assert_that(p.cargo("build")
+                .arg("--bin=a"),
+                execs().with_status(101));
+    assert_that(p.cargo("build")
+                .arg("--example=b"),
+                execs().with_status(101));
+    assert_that(p.cargo("test"),
+                execs().with_status(101));
+    assert_that(p.cargo("bench"),
+                execs().with_status(101));
+}
+
+// target.{}.rustflags takes precedence over build.rustflags
+#[test]
+fn target_rustflags_precedence() {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.0.1"
+        "#)
+        .file("src/lib.rs", "")
+        .file(".cargo/config", &format!("
+            [build]
+            rustflags = [\"--cfg\", \"foo\"]
+
+            [target.{}]
+            rustflags = [\"-Z\", \"bogus\"]
+            ", rustc_host()));
+    p.build();
+
+    assert_that(p.cargo("build")
+                .arg("--lib"),
+                execs().with_status(101));
+    assert_that(p.cargo("build")
+                .arg("--bin=a"),
+                execs().with_status(101));
+    assert_that(p.cargo("build")
+                .arg("--example=b"),
+                execs().with_status(101));
+    assert_that(p.cargo("test"),
+                execs().with_status(101));
+    assert_that(p.cargo("bench"),
+                execs().with_status(101));
+}